﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Prisa.BussinesLogic;
using Prisa.Entities;
using Microsoft.Practices.Unity;

namespace Prisa.UI
{
    public partial class frmMttoCredito : Form
    {
        [Dependency]
        public IClienteBL clienteBL { get; set; }

        [Dependency]
        public IProductoBL productoBL { get; set; }

        [Dependency]
        public ICreditoBL creditoBL { get; set; }

        [Dependency]
        public IDetalleCreditoBL detalleCreditoBL { get; set; }

        [Dependency]
        public IImpuestoBL impBL { get; set; }

        public frmMttoCredito()
        {
            InitializeComponent();
            this.BuildUp();
        }

        private void frmMttoCredito_Load(object sender, EventArgs e)
        {
            lblMensaje.Visible = false;
            lblAyuda.Visible = false;
        }

        bool isNew = true;

        public void Nuevo()
        {
            cREDITOBindingSource.AddNew();
        }

        public void Editar(int id)
        {
            isNew = false;
            var credito = creditoBL.GetFromCreditoById(id);
            cREDITOBindingSource.DataSource = credito;
            credito.CLIENTE = clienteBL.GetFromClienteById(credito.ClienteId);
        }

        private void dniRucTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F1 )//&& isNew == true)
            {
                frmCliente frm = new frmCliente();
                frm.Clien = true;
                frm.ShowDialog();
                if (frm.CurrentCliente != null)
                {
                    var credito = cREDITOBindingSource.Current as CREDITO;
                    credito.CLIENTE = frm.CurrentCliente;
                    credito.ClienteId = frm.CurrentCliente.Id;
                    cREDITOBindingSource.ResetBindings(true);
                    BtnVerificar.Enabled = false;

                    /////////////////////////// VERIFICAR SI EL CLIENTE YA TIENE CREDITOS ASOCIADOS
                    var creditosByCliente = creditoBL.GetFromCreditobyCliente(dniRucTextBox.Text);
                    if (creditosByCliente.Count > 0)
                    {
                        MessageBox.Show(this, "Este cliente ya cuenta con un Crédito", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        credito.CLIENTE = null;
                        credito.ClienteId = 0;
                        dniRucTextBox.Text = "";
                        nombreRazonSocialTextBox.Text = "";
                        cREDITOBindingSource.ResetBindings(true);
                    }

                }

            }
            if (e.KeyCode == Keys.Enter && dniRucTextBox.Text.Length > 0)//isNew == true && )
            {
                if (dniRucTextBox.Text.Length > 0)
                {
                    VerificarCliente();
                }
            }
        }

        private void BtnVerificar_Click(object sender, EventArgs e)
        {
            if (dniRucTextBox.Text.Length > 0)
            {
                VerificarCliente();
            }
        }

        private void dniRucTextBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode == Keys.Tab && dniRucTextBox.Text.Length > 0 )//isNew == true && )
            {
                VerificarCliente();
            }
        }

        private void VerificarCliente()
        {
            var _cliente = clienteBL.GetFromOneClienteByDniRuc(dniRucTextBox.Text);

            if (_cliente != null)
            {
                var credito = cREDITOBindingSource.Current as CREDITO;
                credito.CLIENTE = _cliente;
                credito.ClienteId = _cliente.Id;
                cREDITOBindingSource.ResetBindings(true);

                ///////////////////////////// VERIFICAR SI EL CLIENTE YA TIENE CREDITOS ASOCIADOS
                var creditosByCliente = creditoBL.GetFromCreditobyCliente(dniRucTextBox.Text);
                if (creditosByCliente.Count > 0)
                {
                    MessageBox.Show(this, "Este cliente ya cuenta con un Crédito", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    credito.CLIENTE = null;
                    credito.ClienteId = 0;
                    dniRucTextBox.Text = "";
                    nombreRazonSocialTextBox.Text = "";
                    cREDITOBindingSource.ResetBindings(true);
                }
            }
            else
            {
                MessageBox.Show(this, "Cliente no existente", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                nombreRazonSocialTextBox.Text = "";
            }

        }

        private void BtnBuscarProducto_Click(object sender, EventArgs e)
        {
            BuscarProducto();
        }

        private void TxtDescripcion_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                BuscarProducto();
            }
        }

        private void BuscarProducto()
        {
            List<PRODUCTO> existenProductos;
            existenProductos = productoBL.GetFromProductoByDescripcion(TxtDescripcion.Text);

            if (existenProductos.Count <= 0)
            {
                lblMensaje.Visible = true;
            }
            else
            {
                lblMensaje.Visible = false;
                pRODUCTOBindingSource.DataSource = productoBL.GetFromProductoByDescripcion(TxtDescripcion.Text);
            }
            //var criterio = TxtDescripcion.Text == string.Empty ? null : TxtDescripcion.Text;
            //pRODUCTOBindingSource.DataSource = productoBL.GetFromProductoByDescripcion(criterio);
        }

        private void BtnAddProd_Click(object sender, EventArgs e)
        {
            AgregarProducto();
        }

        private void pRODUCTODataGridView_DoubleClick(object sender, EventArgs e)
        {
            AgregarProducto();
        }

        private void AgregarProducto()
        {
            PRODUCTO producto = pRODUCTOBindingSource.Current as PRODUCTO;
            CREDITO currentCredito = cREDITOBindingSource.Current as CREDITO;

            if (producto != null && producto.Stock > 0)
            {
                var detalle = new DETALLE_CREDITO
                {
                    CreditoId = currentCredito.Id,
                    ProductoId = producto.Id,
                    PRODUCTO = producto,
                    Cantidad = 1,
                    Precio = producto.Precio,
                    Pagado = false,
                    PasadoVenta = false,
                    FechaDetalleCredito = DateTime.Now.Date,
                };

                if (isNew == true)
                {
                    //var fecActual = DateTime.Now.Date;
                    //var existe = currentCredito.DETALLE_CREDITO.Where(dv => dv.PRODUCTO.Id.Equals(producto.Id) 
                    //&& dv.FechaDetalleCredito == fecActual).SingleOrDefault();
                    var existe = currentCredito.DETALLE_CREDITO.Where(dv => dv.PRODUCTO.Id.Equals(producto.Id)).SingleOrDefault();
                    if (existe == null)
                    {
                        currentCredito.DETALLE_CREDITO.Add(detalle);
                        CalcularTotal();
                    }
                    else
                    {
                        var rpt = MessageBox.Show(this, string.Format("El producto: {0}," +"ya se encuentra en le pedido\n ¿Desea agregra otro?", producto.Descripcion),
                        "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                        if (rpt == DialogResult.Yes)
                        {
                            existe.Cantidad++;
                            CalcularTotal();
                        }
                    }
                }
                else 
                {
                    ///////cuando edito y agrego nuevo
                    var existe = currentCredito.DETALLE_CREDITO.Where(dv => dv.PRODUCTO.Id.Equals(producto.Id) && dv.id == 0).SingleOrDefault();
                    if (existe != null)//nuevo en editar
                    {
                        var rpt = MessageBox.Show(this, string.Format("El producto: {0}," + "ya se encuentra en le pedido\n ¿Desea agregra otro?", producto.Descripcion),
                        "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                        if (rpt == DialogResult.Yes)
                        {
                            existe.Cantidad++;
                            CalcularTotal();
                        }
                    }
                    else
                    {
                        currentCredito.DETALLE_CREDITO.Add(detalle);
                        CalcularTotal();
                    }
                }
                cREDITOBindingSource.ResetBindings(true);
                dETALLE_CREDITOBindingSource.ResetBindings(true);
            }
            else MessageBox.Show("La cantidad supera el stock disponible.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        public void CalcularTotal()
        {
            var currentCredito = cREDITOBindingSource.Current as CREDITO;

            if (currentCredito != null)
            {
                Decimal NuevoTotal = 0;
                foreach (var item in currentCredito.DETALLE_CREDITO)
                {
                    if (item.Pagado == false)
                    {
                        //NuevoTotal = NuevoTotal + item.Monto;
                        NuevoTotal = Math.Round(NuevoTotal + item.Monto, 2);
                    }
                }
                currentCredito.Total = NuevoTotal;
                cREDITOBindingSource.ResetBindings(true);
            }
        }

        private void BtnRemove_Click(object sender, EventArgs e)
        {
            QuitarProducto();
        }

        private void QuitarProducto()
        {
            var _credito = cREDITOBindingSource.Current as CREDITO;
            var _detalle = dETALLE_CREDITOBindingSource.Current as DETALLE_CREDITO;

            var rpt = MessageBox.Show(this,string.Format("¿Desea quitar del Pedido el producto: {0}?",_detalle.PRODUCTO.Descripcion),
                    "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (rpt == DialogResult.Yes)
            {
                if (_detalle.id > 0)
                {
                    detalleCreditoBL.RemoveDetalleCreditoByAndCreditoId(_detalle.id, _credito.Id);
                    
                    pRODUCTOBindingSource.DataSource = productoBL.GetAllFromProducto();
                }
                dETALLE_CREDITOBindingSource.RemoveCurrent();
                CalcularTotal();
            }
            
        }

        private void BtnGuardar_Click(object sender, EventArgs e)
        {
            GuardarCredito();
        }

        private void GuardarCredito()
        {
            var currentCredito = cREDITOBindingSource.Current as CREDITO;
            var msg = "ERROR";
            var longitud = dniRucTextBox.Text;

            if (currentCredito != null)
            {
                //

                if (isNew == true)
                {
                    try
                    {
                        currentCredito.FechaCredito = DateTime.Today.Date;
                        creditoBL.AddCredito(currentCredito);
                        PrimerPago(currentCredito.Id, currentCredito.CLIENTE.Id);
                        MessageBox.Show("Registro Correcto", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        Close();
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }

                if (isNew == false)
                {
                    try
                    {
                        creditoBL.UpdateCredito(currentCredito);
                        Editar(currentCredito.Id);
                        MessageBox.Show("Modificación Correcto", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        Close();
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
        }

        private void PrimerPago(int idCredito, int idCliente)
        {
            var rpt = MessageBox.Show(this,
                        string.Format("¿Desea dejar algún monto?"), "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (rpt == DialogResult.Yes)
            {
                var frm = new frmPrimerPago();
                frm.nuevoPago(idCredito, idCliente); ;
                frm.ShowDialog();
            }
        }

        private void pRODUCTODataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                AgregarProducto();
            }
        }

        private void dETALLE_CREDITODataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0 || e.ColumnIndex == 2)
            {
                var producto = new PRODUCTO();
                var detalle = dETALLE_CREDITOBindingSource.Current as DETALLE_CREDITO;

                var canidad = e.ColumnIndex == 0;

                if (detalle != null)
                {
                    producto = productoBL.GetFromProductoById(detalle.PRODUCTO.Id);
                    if (detalle.Cantidad > producto.Stock)
                    {
                        MessageBox.Show("La cantidad supera el stock disponible", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        detalle.Cantidad = 1;
                        CalcularTotal();
                    }
                    else
                    {
                        CalcularTotal();
                    }
                    dETALLE_CREDITOBindingSource.ResetBindings(true);
                }
            }
        }

        private void dETALLE_CREDITODataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            var _detalle = dETALLE_CREDITOBindingSource.Current as DETALLE_CREDITO;

            if (this.dETALLE_CREDITODataGridView.Columns[e.ColumnIndex].Name.Equals("quitar"))
            {
                QuitarProducto();
            }

        }

        private void btnBuscarDetalle_Click(object sender, EventArgs e)
        {
            BuscarProductoEnDetalle();
        }

        private void txtProdDesc_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                BuscarProductoEnDetalle();
            }
        }

        private void BuscarProductoEnDetalle()
        {
            List<DETALLE_CREDITO> listaTemp = new List<DETALLE_CREDITO>();
            var producto = pRODUCTOBindingSource.Current as PRODUCTO;
            var _credito = cREDITOBindingSource.Current as CREDITO;

            if (_credito != null)
            {
                if (txtProdDesc.Text != null && txtProdDesc.Text != "" && txtProdDesc.Text != string.Empty)
                {
                    foreach (var item in _credito.DETALLE_CREDITO)
                    {
                        var descMayus = (txtProdDesc.Text).ToUpper();
                        var itemPRO = (item.PRODUCTO.Descripcion).ToUpper();
                        var a = itemPRO.Contains(descMayus);
                        if (a == true)
                        {
                            listaTemp.Add(item);
                        }
                    }
                    dETALLE_CREDITOBindingSource.DataSource = listaTemp;
                    dETALLE_CREDITOBindingSource.ResetBindings(true);
                }
                else
                {
                    dETALLE_CREDITOBindingSource.DataSource = _credito.DETALLE_CREDITO;
                    dETALLE_CREDITOBindingSource.ResetBindings(true);
                }
            }
            else
                MessageBox.Show("No existen productos en el Crédito", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void dniRucTextBox_TextChanged(object sender, EventArgs e)
        {
            lblAyuda.Visible = true;
        }

        private void dniRucTextBox_Leave(object sender, EventArgs e)
        {
            lblAyuda.Visible = false;
        }

        private void dniRucTextBox_Click(object sender, EventArgs e)
        {
            lblAyuda.Visible = true;
        }

        private void dniRucTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!(char.IsNumber(e.KeyChar)) && (e.KeyChar != (char)Keys.Back)
                && (e.KeyChar != (char)Keys.Enter) && (e.KeyChar != (char)Keys.Clear))
            {
                e.Handled = true;
                return;
            }
        }

        private void dETALLE_CREDITODataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            if (e.Control is TextBox)
            {
                TextBox txt = e.Control as TextBox;
                //si la columna es numerica
                if (object.ReferenceEquals(dETALLE_CREDITODataGridView.CurrentCell.ValueType, typeof(System.Int32)))
                {
                    //asignar el evento de solo numeros a las columnas numericas
                    txt.KeyPress += OnlyNumbers_KeyPress;
                }
                else //o text
                    txt.KeyPress -= OnlyNumbers_KeyPress;
                ((TextBox)(e.Control)).CharacterCasing = CharacterCasing.Upper;
            }
        }

        private void OnlyNumbers_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && e.KeyChar != 8) // Si no es numerico y si no es espacio
            {
                // Invalidar la accion
                e.Handled = true;
                // Enviar el sonido de beep de windows
                System.Media.SystemSounds.Beep.Play();
            }
        }

        private void dETALLE_CREDITODataGridView_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!(char.IsNumber(e.KeyChar)) && (e.KeyChar != (char)Keys.Back)
                && (e.KeyChar != (char)Keys.Enter) && (e.KeyChar != (char)Keys.Clear))
            {
                e.Handled = true;
                return;
            }
        }

        private void dETALLE_CREDITODataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            decimal testInt;
            if (e.ColumnIndex == 0 || e.ColumnIndex == 2 || e.ColumnIndex == 3)
            {
                if (e.FormattedValue.ToString().Length != 0)
                {
                    if (!decimal.TryParse(e.FormattedValue.ToString(), out testInt))
                    {
                        dETALLE_CREDITODataGridView.Rows[e.RowIndex].ErrorText = "El monto debe ser un numero";
                        e.Cancel = true;
                    }
                    else
                    {
                        dETALLE_CREDITODataGridView.Rows[e.RowIndex].ErrorText = string.Empty;
                        e.Cancel = false;
                    }
                }
            }
        }

        private void dETALLE_CREDITODataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                QuitarProducto();
            }
        }

        private void pRODUCTODataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (this.pRODUCTODataGridView.Columns[e.ColumnIndex].Name.Equals("Agregar"))
            {
                AgregarProducto();
            }
        }

        private void BtnNewProducto_Click(object sender, EventArgs e)
        {
            var frm = new frmMttoProducto();
            frm.Nuevo();
            frm.ShowDialog();
            pRODUCTOBindingSource.DataSource = productoBL.GetFromProductoByDescripcion(TxtDescripcion.Text);
            lblMensaje.Visible = false;
        }

        private void dETALLE_CREDITODataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            MessageBox.Show("La cantidad debe ser un numero", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void TxtDescripcion_KeyPress(object sender, KeyPressEventArgs e)
        {
            var guion = Convert.ToString("-");
            var coma = Convert.ToString(",");
            var punto = Convert.ToString(".");
            var slash = Convert.ToString("/");
            var amber = Convert.ToString("&");

            string cadena = guion + coma + punto + slash + amber + (char)8;
            if (!cadena.Contains(e.KeyChar) && !(char.IsLetter(e.KeyChar)) && !(char.IsNumber(e.KeyChar))
                && (e.KeyChar != (char)Keys.Back) && (e.KeyChar != (char)Keys.Enter) && (e.KeyChar != (char)Keys.Clear)
                && !(char.IsSeparator(e.KeyChar)))
            {
                e.Handled = true;
                return;
            }
        }

        private void txtProdDesc_KeyPress(object sender, KeyPressEventArgs e)
        {
            var guion = Convert.ToString("-");
            var coma = Convert.ToString(",");
            var punto = Convert.ToString(".");
            var slash = Convert.ToString("/");
            var amber = Convert.ToString("&");

            string cadena = guion + coma + punto + slash + amber + (char)8;
            if (!cadena.Contains(e.KeyChar) && !(char.IsLetter(e.KeyChar)) && !(char.IsNumber(e.KeyChar))
                && (e.KeyChar != (char)Keys.Back) && (e.KeyChar != (char)Keys.Enter) && (e.KeyChar != (char)Keys.Clear)
                && !(char.IsSeparator(e.KeyChar)))
            {
                e.Handled = true;
                return;
            }
        }


    }
}
